#include <iostream>
#include <algorithm>
#include <limits>
#include "../Interfaces/InterfazAdministrador.h"
#include "../Archivos/Configuracion.h"
#include "../Archivos/Log.h"
#include "../Interfaces/AdministradorABM.h"
#include "../Interfaces/InterfazVotante.h"
#include "../Interfaces/IAbm.h"
#include "../Manejadores/ManejadorAdministrador.h"

using namespace Manejadores;
using namespace Interfaces;
using namespace ABM;

int main() {

	//  Se instancian las clases confing y log que son unicas para todos las demas clases
	Configuracion* config = Configuracion::getInstancia();
	Log* log = Log::getInstancia();

	//si no existe un usuario administrador, mando a crear uno
	ManejadorAdministrador* manejadorAdministador = new ManejadorAdministrador();
	if (manejadorAdministador->noHayUsuariosAdmin()){
		IAbm* adminABM = new AdministradorABM();
		adminABM->menu();
		delete adminABM;
	}
	delete manejadorAdministador;


	char opcion;
	bool fin = false;

	while (!fin) {
		system("clear");
		cout << "BIENVENIDO A ELECCIONES" << endl;
		cout << "========================" << endl;
		cout << "Para cumplir su obligacion civica ";
		cout << "Por favor registrese" << endl;
		cout << "Elija tipo de Usuario: " << endl;
		cout << "			1-Administrador" << endl;
		cout << "			2-Votante" << endl;
		cout << endl;
		cout << "Si desea salir presione 9" << endl;
		cout << "Opcion: ";
		cin >> opcion;
		cout << endl;
		switch (opcion) {
		case ('1'): {
			InterfazAdministrador* interfazAdmin = new InterfazAdministrador();
			interfazAdmin->menuPrincipal();
			delete interfazAdmin;
			break;
		}
		case ('2'): {
			InterfazVotante* interfazVotante = new InterfazVotante();
			interfazVotante->menuPrincipal();
			delete interfazVotante;
			break;
		}
		case ('9'): {
			system("clear");
			log->escribir("La aplicacion ha finalizado correctamente.");
			cout << "La aplicación ha finalizado correctamente." << endl;
			fin = true;
			break;
		}
		default:{
			cout << "Opcion Incorrecta. Vuelvalo a Intentar." << endl;
			getchar();
			system("clear");
		}
		}
	}

	delete log;
	delete config;
	return 0;
}
